package com.weixin.core;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;
import com.weixin.config.WxConfig;
import com.weixin.interfaces.WeixinCallback;
import com.weixin.utils.WxJson;

/**
 * 类描述：获取微信数据<br>
 * 创建人：邓强   <br>
 * 创建时间：2017年7月6日 上午10:02:12    <br> 
 * 修改人：  <br>
 * 修改时间：2017年7月6日 上午10:02:12   <br>  
 * 修改备注：     <br>
 * @version   V1.0
 */
public class WxActuator {
	private static Logger log=LoggerFactory.getLogger(WxActuator.class);
	/**
	 * 总多重复调用三次
	 */
	private static Integer count = 3;
	
	public static String execute(WxConfig wxConfig, WeixinCallback winxinCallback){
		String retJson = null;
		try {
			retJson = execute(wxConfig, winxinCallback, 0);
		} catch (Exception e) {
			log.error(e.getMessage(),e);
		}
		
		return retJson;
	}
	
	private static String execute(WxConfig wxConfig, WeixinCallback winxinCallback,Integer curr){
		String retJson = null;
		if(curr < count){
			retJson = winxinCallback.callback(wxConfig);
			JSONObject json = WxJson.fromJson(retJson, JSONObject.class);
			String errcode = json.getString("errcode");
			if(errcode != null && !errcode.equals("0")){
				curr++;
				if(errcode.equals("40001")){
					log.info("公众号{}--access_token失效，重新获取",wxConfig.getWxNo());
					TokenFactory.deleteToken(wxConfig);
					retJson = winxinCallback.callback(wxConfig);
				}else if(errcode.equals("42001")){
					log.info("公众号{}---access_token超时，重新获取",wxConfig.getWxNo());
					TokenFactory.deleteToken(wxConfig);
					retJson = winxinCallback.callback(wxConfig);
				}else if(errcode.equals("-1")){
					return execute(wxConfig, winxinCallback,curr);
				}else if(errcode.equals("48001")){
					log.error("微信获取数据异常，没有该权限");
				}else{
					throw new RuntimeException("微信获取数据异常，"+json.toJSONString());
				}
			}
		}
		return retJson;
	}
}
